package example;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Attore extends Persona {
	
	public static final String tabName = "attore";

    public static final String filmIdField = "film_id";
    public static final String personaIdField = "persona_id";
    
    public int filmId;
    
    public Attore() {
    	this.filmId = -1;
    	this.id = -1;
    }
    
    public Attore( Persona p, int filmId ) {
    	set(p, filmId);
    }
    
    public Result validate() {
    	Result result = new Result( true, null, "" );
    	
    	if ( filmId < 1 ) { //TODO controllare su db?
    		result.result = false;
    		result.errorMessage += "Inserire un film ID valido\n";
    	}
    	
    	if ( id < 1 ) { //TODO controllare su db?
    		result.result = false;
    		result.errorMessage += "Inserire una persona ID valida\n";
    	}
    	
    	return result;
    }
    
    public void set( Persona p, int filmId ) {
    	this.id = p.id;
    	this.filmId = filmId;
    	this.nome = p.nome;
    	this.cognome = p.cognome;
    	this.dataNascita = p.dataNascita;
    	this.luogoNascita = p.luogoNascita;
    	this.biografia = p.biografia;
    	this.awards = p.awards;
    	
    	return;
    }
    
    public Result save( Connection c, int filmIdm ) {
    	return save(c, filmId, true);
    }
    
    public Result save( Connection c, int filmId, boolean validate ) {
    	
    	Result result = null;
    	int rowInserted;
    	
    	String query = "";
    	PreparedStatement pstmt = null;
    	ResultSet rs = null;
    	
    	if ( validate ) {
    		result = validate();
    		if ( !result.result )
    			return result;
    	}
    	
    	try {
    		
    		c.setAutoCommit(false);
    		
    		query = "INSERT INTO "+ tabName +" ( " + filmIdField + ", " + personaIdField  + "  ) VALUES (?,?)";
	    		
	    	
	    	pstmt = c.prepareStatement(query);
	    	
	    	pstmt.setInt(1, filmId  );
	    	pstmt.setInt(2, this.id  );
	    	
	    	rowInserted = pstmt.executeUpdate();
	    	if ( rowInserted > 0 ) {
	    		result = new Result ( true, this, "Record inserito per l'attore con ID " + this.id + " associato al film con ID " + filmId );
	    		if ( Test.DEBUG ) System.out.println( result.errorMessage );
	    		this.filmId = filmId;
	    	} else {
	    		result = new Result ( false, null, "Record NON inserito per l'attore con ID " + this.id + " associato al film con ID " + filmId );
	    		if ( Test.DEBUG ) System.out.println( result.errorMessage );
	    	}
	    	
	    	
	        pstmt.close();
	    	c.commit();
	    	
	    	
	    	c.setAutoCommit(true);
	    	
	    	
	    	
    	} catch(Exception e){
    		result = new Result ( false, null, "Errore generale: " +e.getMessage() + "\nRecord non inserito per l'attore con ID " + this.id + " associato al film con ID " + filmId );
    		System.out.println( "Errore generale: " +e.getMessage());
            //e.printStackTrace();
            // rollback
            try{
            	System.out.println("Rollback, annullo modifiche al database");
                c.rollback();
            } catch(Exception eRollback){}
        
        } finally {
            try{
                if( rs != null )
                    rs.close();
                if( pstmt != null )
                    pstmt.close();
            } catch(Exception e){
            	result = new Result ( false, null, "Rilascio risorse non riuscito: "+e.getMessage() + "\nRecord non inserito per l'attore con ID " + this.id + " associato al film con ID " + filmId );
            	System.out.println(" Rilascio risorse non riuscito: "+e.getMessage());
            }
        }
    	

        return result;
    	
    }
    
    public Result delete( Connection c ) {
    	// cancellala dal db
    	String query = "";
    	int affectedRows = 0;
    	Result result = null;
    	PreparedStatement pstmt = null;
    	ResultSet rs = null;
    	
    	try {
    		c.setAutoCommit(false);
    		query = "DELETE FROM " + tabName + " WHERE " + personaIdField + " = ?";
    		pstmt = c.prepareStatement(query);
    		pstmt.setInt(1, this.id);
    		
    		affectedRows = pstmt.executeUpdate();
    		if ( affectedRows > 0 ) {
    			result = new Result ( true, null, "" );
	    	} else {
	    		result = new Result ( false, null, "Record non cancellato con attore ID " + this.id );
	    	}
    			
    		
    		rs.close();
    		pstmt.close();
    		c.commit();

    		
    	} catch(Exception e){
            System.out.println( "Errore generale: " +e.getMessage());
            result = new Result ( false, null, "Errore generale: " +e.getMessage() + "\nRecord non cancellato con attore ID " + this.id );
            // rollback
            try{
            	System.out.println("Rollback, annullo modifiche al database");
                c.rollback();
            } catch(Exception eRollback){}
        
        } finally {
            try{
                if( rs != null )
                    rs.close();
                if( pstmt != null )
                    pstmt.close();
            } catch(Exception e){
            	result = new Result ( false, null, "Rilascio risorse non riuscito: " +e.getMessage() + "\nRecord non cancellato con attore ID " + this.id );
                System.out.println("Rilascio risorse non riuscito: "+e.getMessage());
            }
        }
        
        return result;
    }

}
